home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / python / BitTorrent / RateMeasure.py < prev    next >
Encoding:
Python Source  |  2007-11-12  |  1.5 KB  |  53 lines

  1. # Written by Bram Cohen
  2. # see LICENSE.txt for license information
  3.  
  4. from time import time
  5.  
  6. class RateMeasure:
  7.     def __init__(self, left):
  8.         self.start = None
  9.         self.last = None
  10.         self.rate = 0
  11.         self.remaining = None
  12.         self.left = left
  13.         self.broke = False
  14.         self.got_anything = False
  15.  
  16.     def data_came_in(self, amount):
  17.         if not self.got_anything:
  18.             self.got_anything = True
  19.             self.start = time() - 2
  20.             self.last = self.start
  21.             self.left -= amount
  22.             return
  23.         self.update(time(), amount)
  24.  
  25.     def data_rejected(self, amount):
  26.         self.left += amount
  27.  
  28.     def get_time_left(self):
  29.         if not self.got_anything:
  30.             return None
  31.         t = time()
  32.         if t - self.last > 15:
  33.             self.update(t, 0)
  34.         return self.remaining
  35.  
  36.     def get_size_left(self):
  37.         return self.left
  38.  
  39.     def update(self, t, amount):
  40.         self.left -= amount
  41.         try:
  42.             self.rate = ((self.rate * (self.last - self.start)) + amount) / (t - self.start)
  43.             self.last = t
  44.             self.remaining = self.left / self.rate
  45.             if self.start < self.last - self.remaining:
  46.                 self.start = self.last - self.remaining
  47.         except ZeroDivisionError:
  48.             self.remaining = None
  49.         if self.broke and self.last - self.start < 20:
  50.             self.start = self.last - 20
  51.         if self.last - self.start > 20:
  52.             self.broke = True
  53.